/*
 * testlibpq.c
 *
 *		Test the C version of libpq, the PostgreSQL frontend library.
 */
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

#include <arpa/inet.h>

static void
exit_nicely(PGconn *conn)
{
	PQfinish(conn);
	exit(1);
}

int
main(int argc, char **argv)
{
	const char *conninfo;
	PGconn	   *conn;
	PGresult   *res;
	int			nFields;
	int			i,
				j;

	/*
	 * If the user supplies a parameter on the command line, use it as the
	 * conninfo string; otherwise default to setting dbname=postgres and using
	 * environment variables or defaults for all other connection parameters.
	 */
	if (argc > 1)
		conninfo = argv[1];
	else
		conninfo = "dbname = template1";

	/* Make a connection to the database */
	conn = PQconnectdb(conninfo);

	/* Check to see that the backend connection was successfully made */
	if (PQstatus(conn) != CONNECTION_OK)
	{
		fprintf(stderr, "Connection to database failed: %s",
				PQerrorMessage(conn));
		exit_nicely(conn);
	}

	/*
	 * Our test case here involves using a cursor, for which we must be inside
	 * a transaction block.  We could do the whole thing with a single
	 * PQexec() of "select * from pg_database", but that's too trivial to make
	 * a good example.
	 */

	/* Start a transaction block */
	res = PQexec(conn, "BEGIN");
	if (PQresultStatus(res) != PGRES_COMMAND_OK)
	{
		fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
		PQclear(res);
		exit_nicely(conn);
	}

	/*
	 * Should PQclear PGresult whenever it is no longer needed to avoid memory
	 * leaks
	 */
	PQclear(res);

        int xx;

        const char* values [1];
        int length;
        int format;

        res = PQexec (conn, "PREPARE stmt (int) AS select xx,yy from nemesis_db_test where xx >= $1");
	if (PQresultStatus(res) != PGRES_COMMAND_OK) 
	{
		fprintf(stderr, "PREPARE command failed: %s\n", PQresultErrorMessage(res));
		PQclear(res);
		exit_nicely(conn);
	}

        int maxRow;

        xx = htonl (5);
        values[0] = (char*) &xx;
        length = sizeof (int);
        format = 1;

        res = PQexecPrepared (conn, "stmt", 1, &values, &length, &format, 1);
	if (PQresultStatus(res) != PGRES_TUPLES_OK)
	{
		fprintf(stderr, "PQexecPrepared command failed: %s\n",  PQresultErrorMessage(res));
		PQclear(res);
		exit_nicely(conn);
  	}
        else {
           int maxRow, row;

           printf ("Filas seleccionadas: %d\n", maxRow = PQntuples (res));

           for (row = 0; row < maxRow; row ++) {
              printf ("XX: ");
              if (PQgetisnull (res, row, 0) == 0) {
                 char* value = PQgetvalue (res, row, 0);
                 printf ("%d", htonl (*((int*) value)));
              }
              else 
                 printf ("<null>");

              printf ("\tYY: ");
              if (PQgetisnull (res, row, 1) == 0) {
                 printf ("%s", PQgetvalue (res, row, 1));
              }
              else 
                 printf ("<null>");

              printf ("\n");
           }
        }

	PQclear(res);

	/* close the connection to the database and cleanup */
	PQfinish(conn);

	return 0;
}


